package com.open.capacity.prints.util;

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.activation.MimetypesFileTypeMap;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.*;

/**
 * @author 作者 owen 
 * @version 创建时间：2017年11月12日 上午22:57:51
 * 文件工具类
*/
@Slf4j
public class FileUtil {

	public static MultipartFile toMultipartFile(String fieldName, File file) throws Exception {
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		String contentType = new MimetypesFileTypeMap().getContentType(file);
		FileItem fileItem = diskFileItemFactory.createItem(fieldName, contentType, false, file.getName());
		try (
				InputStream inputStream = new ByteArrayInputStream(FileCopyUtils.copyToByteArray(file));
				OutputStream outputStream = fileItem.getOutputStream()
		) {
			FileCopyUtils.copy(inputStream, outputStream);
		} catch (Exception e) {
			throw e;
		}
		MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
		return multipartFile;
	}


	public static MultipartFile toMultipartFile(String fieldName, String fileName, byte[] fileByteArray) throws Exception {
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		String contentType = new MimetypesFileTypeMap().getContentType(fileName);
		FileItem fileItem = diskFileItemFactory.createItem(fieldName, contentType, false, fileName);
		try (
				InputStream inputStream = new ByteArrayInputStream(fileByteArray);
				OutputStream outputStream = fileItem.getOutputStream()
		) {
			FileCopyUtils.copy(inputStream, outputStream);
		} catch (Exception e) {
			throw e;
		}
		MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
		return multipartFile;
	}

	/**
	 * 将文件转换成byte数组
	 * @return
	 */
	public static byte[] File2byte(File tradeFile){
		byte[] buffer = null;
		try
		{
			FileInputStream fis = new FileInputStream(tradeFile);
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			byte[] b = new byte[1024];
			int n;
			while ((n = fis.read(b)) != -1)
			{
				bos.write(b, 0, n);
			}
			fis.close();
			bos.close();
			buffer = bos.toByteArray();
		}catch (FileNotFoundException e){
			log.error(e.getMessage());
		}catch (IOException e){
			log.error(e.getMessage());
		}
		return buffer;
	}


	/**
	 * 文件的md5
	 * 
	 * @param inputStream
	 * @return
	 */
	public static String fileMd5(InputStream inputStream) {
		try {
			return DigestUtils.md5Hex(inputStream);
		} catch (IOException e) {
			log.error("FileUtil->fileMd5:{}" ,e.getMessage());
		}

		return null;
	}

	public static String saveFile(MultipartFile file, String path) {
		try {
			File targetFile = new File(path);
			if (targetFile.exists()) {
				return path;
			}

			if (!targetFile.getParentFile().exists()) {
				targetFile.getParentFile().mkdirs();
			}
			file.transferTo(targetFile);

			return path;
		} catch (Exception e) {
			log.error("FileUtil->saveFile:{}" ,e.getMessage());
		}

		return null;
	}

	public static boolean deleteFile(String pathname) {
		File file = new File(pathname);
		if (file.exists()) {
			boolean flag = file.delete();

			if (flag) {
				File[] files = file.getParentFile().listFiles();
				if (files == null || files.length == 0) {
					file.getParentFile().delete();
				}
			}

			return flag;
		}

		return false;
	}
}
